;累加100的和，并在屏幕上显示

;数据定义
jmp start

str1 db "1+2+3+...+100="

;内存和栈段的划分
;显存0xb800:0000 es:di
;数据段 0x7c00:0000 ds:si
;栈 0x0000:0000 ss:sp

start:
mov ax,0xb800 
mov es,ax
mov ax,0x7c0
mov ds,ax
mov ax,0
mov ss,ax ;设置栈段
xor sp,sp ;设置栈指针


;将str1中的数据写入显存

mov cx,start-str1 ;循环次数
mov si,str1;使用movsb指令，设置偏移地址，下同,原数据偏移地址
xor di,di;目标位置偏移地址 

loop1:
movsb ;执行该指令后,目标偏移地址di，和原数据偏移地址si，都会+1
mov byte [es:di],7 ;设置字符属性，写入显存
inc di 
loop loop1


;累加100的和，并保存结果

mov cx,100 ;循环100次
mov ax,0  ;ax保存count的结果
mov bx,1  ;从1开始

count:
add ax,bx ;累加 
inc bx 
dec cx
cmp cx,0
jne count


;分解累加结果的位

mov si,10 ;除数
mov cx,0

split:
inc cx ;用于pop多少栈数据
xor dx,dx ;注意，dx要清零
div si
add dx,30h ;+30h对应ascll编码数字
push dx		;压入栈中sp会-2	
cmp ax,0  ;如果ax==0就退出
jne split 

;将分解的数位写入显存

show:
pop ax ;将数据弹出栈
mov [es:di],ax ;写入分解的数位
inc di
mov byte [es:di],7 ;写入属性,当写入的是立即数时，必须指定写入的字节数
inc di
loop show

jmp $

times 510-($-$$) db 00
db 0x55,0xaa

;